/*--------------------------------------------------------------------------
 * gin.h
 *	  广义倒排索引访问方法的公共头文件
 *
 *	Copyright (c) 2006-2022, PostgreSQL Global Development Group
 *
 *	src/include/access/gin.h
 *--------------------------------------------------------------------------
 */
#ifndef GIN_H
#define GIN_H

#include "access/xlogreader.h"
#include "lib/stringinfo.h"
#include "storage/block.h"
#include "utils/relcache.h"


/*
 * 用于倒排索引的 amproc 索引。
 */
#define GIN_COMPARE_PROC			   1
#define GIN_EXTRACTVALUE_PROC		   2
#define GIN_EXTRACTQUERY_PROC		   3
#define GIN_CONSISTENT_PROC			   4
#define GIN_COMPARE_PARTIAL_PROC	   5
#define GIN_TRICONSISTENT_PROC		   6
#define GIN_OPTIONS_PROC	   7
#define GINNProcs					   7

/*
 * extractQueryFn 的 searchMode 设置。
 */
#define GIN_SEARCH_MODE_DEFAULT			0
#define GIN_SEARCH_MODE_INCLUDE_EMPTY	1
#define GIN_SEARCH_MODE_ALL				2
#define GIN_SEARCH_MODE_EVERYTHING		3	/* 仅供内部使用 */

/*
 * GinStatsData 代表供计划程序使用的统计数据
 */
typedef struct GinStatsData
{
	BlockNumber nPendingPages;
	BlockNumber nTotalPages;
	BlockNumber nEntryPages;
	BlockNumber nDataPages;
	int64		nEntries;
	int32		ginVersion;
} GinStatsData;

/*
 * 三元值用于三一致性函数。
 *
 * 这必须与 bool 的大小相同，因为某些代码将一个
 * 指针从 bool 强制转换为 GinTernaryValue 的指针。
 */
typedef char GinTernaryValue;

#define GIN_FALSE		0		/* 项目不存在/不匹配 */
#define GIN_TRUE		1		/* 项目存在/匹配 */
#define GIN_MAYBE		2		/* 不确定项目是否存在/不确定
								 * 是否匹配 */

#define DatumGetGinTernaryValue(X) ((GinTernaryValue)(X))
#define GinTernaryValueGetDatum(X) ((Datum)(X))
#define PG_RETURN_GIN_TERNARY_VALUE(x) return GinTernaryValueGetDatum(x)

/* GUC 参数 */
extern PGDLLIMPORT int GinFuzzySearchLimit;
extern PGDLLIMPORT int gin_pending_list_limit;

/* ginutil.c */
extern void ginGetStats(Relation index, GinStatsData *stats);
extern void ginUpdateStats(Relation index, const GinStatsData *stats,
						   bool is_build);

#endif							/* GIN_H */
